package com.leetcode.stack;

import java.util.Stack;

/**
 * @author: ZhouBert
 * @date: 2019/10/11
 * @description:	150. 逆波兰表达式求值--这个中等的题比起 {@link com.shangguigu.stack.exc.ExpressionCalc} 还是差了点，但是那是一个中缀计算，如果有括号就多了另一种逻辑！
 * B
 * 根据逆波兰表示法，求表达式的值。
 *
 * 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
 *
 * 说明：
 * 整数除法只保留整数部分。
 * 给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。
 * 示例 1：
 * 输入: ["2", "1", "+", "3", "*"]
 * 输出: 9
 * 解释: ((2 + 1) * 3) = 9
 * 示例 2：
 * 输入: ["4", "13", "5", "/", "+"]
 * 输出: 6
 * 解释: (4 + (13 / 5)) = 6
 * 示例 3：
 * 输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
 * 输出: 22
 * 解释:
 *   ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
 * = ((10 * (6 / (12 * -11))) + 17) + 5
 * = ((10 * (6 / -132)) + 17) + 5
 * = ((10 * 0) + 17) + 5
 * = (0 + 17) + 5
 * = 17 + 5
 * = 22
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class EvalRPN150 {

	private String[] ope=new String[]{"*","+","-","/"};

	/**
	 * so easy!
	 * 9ms-92%
	 * @param tokens
	 * @return
	 */
	public int evalRPN(String[] tokens) {
		Stack<Integer> numStack=new Stack<>();
		for (int i = 0; i < tokens.length; i++) {
			///1.如果是数字
			if (isDigit(tokens[i])){
				numStack.push(Integer.valueOf(tokens[i]));
			}else {
				int val=calc(numStack.pop(),numStack.pop(),tokens[i]);
				numStack.push(val);
			}
		}
		return numStack.pop();

	}

	/**
	 * 判断一个字符串是否为整数（按照题意简单判断）
	 * @return
	 */
	public boolean isDigit(String str){
		for (int i = 0; i < ope.length; i++) {
			if (str.equals(ope[i])){
				return false;
			}
		}
		return true;
	}

	/**
	 *
	 * @param a	eg.被减数
	 * @param b
	 * @param ope
	 * @return
	 */
	public int calc(int a,int b, String ope){
		int ans=0;
		switch (ope){
			case "*":ans=a*b;break;
			case "/":ans=b/a;break;
			case "+":ans=b+a;break;
			case "-":ans=b-a;break;
		}
		return ans;
	}

	public static void main(String[] args) {

	}
}
